//
//  WBStatusListViewModel.swift
//  微博
//
//  Created by dong on 2018/2/13.
//  Copyright © 2018年 dong. All rights reserved.
//

import Foundation

/// 微博数据列表视图模型
/*
 父类的选择
 
 - 如果类需要使用 ‘kvc'或者字典转模型框架设置对象值，类就需要继承自NSObject
 - 如果类知识包装一些代码逻辑（写了一些函数），可以不应任何父类，好处：更加轻量级
 - 提示：如果用OC写，一律都继承自NSObject即可
 
 使命：负责微博的数据处理
 */

///上拉刷新最大尝试次数
private let maxPullupTryTimes = 3

class WBStatusListViewModel {
    
    ///微博模型数组懒加载
    /// - parameter pullup:  是否上拉刷新
    /// - parameter completion:  完成回调【网络请求是否成功,是否有更多的上拉刷新】
    lazy  var statusList = [WBStatus]()
    ///上拉刷新错误次数
    private var pullupErrorTimes = 0
    
    
    func loadStatus(pullup: Bool,completion: @escaping (_ isSuccess: Bool, _ shouldRefresh: Bool)->()){
        
        //判断是否是上拉刷新，同时检查刷新错误
        if pullup && pullupErrorTimes > maxPullupTryTimes {
            
            completion(true , false)
            
            return
            
        }
        
        
        //since_id 取出数组中第一条微博的id
        let since_id = pullup ? 0 : (statusList.first?.id ?? 0)
        //上拉刷新，取出数组的最后一条微博的id
        let max_id = !pullup ? 0 : (statusList.last?.id ?? 0)
        
        WBNetworkManager.shared.statusList(since_id: since_id, max_id: 0){ (list, isSuccess) in
            
            //1.字典转模型
            guard let array = NSArray.yy_modelArray(with: WBStatus.self, json: list ?? []) as? [WBStatus]  else{
                
                completion(isSuccess, false)
                
                return
                
            }
            
            print("刷新到\(array.count)条数据")
            
            //2. 拼接数据
            //下拉刷新应该将结果拼接在数组前面
            if pullup{
                
                self.statusList += array
            }else{
                
                self.statusList = array + self.statusList
            }
            
            //3.判断上拉刷新的数据量
            if pullup && array.count == 0 {
                
                self.pullupErrorTimes += 1
                
                completion(isSuccess, false)
                
            }else{
            //完成回调
            completion(isSuccess, true)
            }
        }
    }
    
}
